package com.sigmatrix.h5.utils;

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
import java.util.function.Consumer;
import java.util.function.Function;

import com.sigmatrix.sc.jdbc.common.lang.Session;
import com.sigmatrix.sc.jdbc.common.lang.User;

/**
 * 
 *@ClassName: ThreadPool
 *@Description: 线程池，只需传入一个方法，在开启线程时会自定复制session
 *@author MH
 *@date 2017年11月13日 上午10:17:12
 */
public class ThreadPool {
	
	public static ExecutorService executor = Executors.newFixedThreadPool(30);
	
	/**
	 * 
	 *@Title: submit
	 *@Description: 开启线程
	 *@return Future<R> 线程要执行的业务 R为改方法返回的结果类型
	 *@author MH
	 *@date 2017年11月13日 上午10:18:47
	 *@param function
	 *@return
	 */
	@SuppressWarnings("hiding")
	public static <Void, R> Future<R> submit(Function<Void, R> function){
		final User user = Session.get();
		
		return executor.submit(() -> {
			Session.set(user);
			R r = function.apply(null);
			Session.clear(); 
			return r;
		});
	}
	public static <R> void submit(Consumer<R> function){
		final User user = Session.get();
		executor.submit(() -> {
			Session.set(user);
			function.accept(null);
			Session.clear(); 
		});
	}
	
}
